package com.itany.jdbc;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * Author:shixiaojun@itany.com
 * Date:2022/11/10 13:44
 * Version:1.0-SNAPSHOT
 * Description:
 */
public class Test {

    public static void main(String[] args) {
//        User user = new User("jack","123456","13812345678","江苏-南京");
//        insertUser(user);
        List<User> users = selectAll();
        for(User user : users){
            System.out.println(user);
        }
    }

    public static void insertUser(User user){
        Connection conn = null;
        Statement st = null;
        try {
            // 1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");

            // 2.获取连接,连接到需要操作的数据库中
            // 参数一:连接到数据库的url地址
                // 对于MySQL而言,其url地址格式为 jdbc:mysql://服务的ip地址:服务的端口/库名
                // MySQL默认端口:3306
                // ?useUnicode=true&characterEncoding=utf-8:解决Java访问数据库出现的乱码问题
            // 参数二:数据库对应的账号
            // 参数三:数据库对应的密码
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8","root","");

            // 3.获取状态集
            st = conn.createStatement();

            // 4.执行sql
            String sql = "insert into t_user(username,password,phone,address) values ('"+user.getUsername()+"','"+user.getPassword()+"','"+user.getPhone()+"','"+user.getAddress()+"')";


            // 执行DML操作,即:增删改操作
            // 返回值:受到影响的数据的行数
            int row = st.executeUpdate(sql);
            System.out.println("Query Ok,"+row+"rows affected");
            // 5.处理结果集(将数据库的数据映射成Java对象)
            // 仅限查询操作
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("找不到驱动");
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 6.释放资源
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(st != null){
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static List<User> selectAll(){
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
        List<User> users = new ArrayList<>();
        try {
            // 1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2.获取连接
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8","root","");

            // 3.获取状态集
            st = conn.createStatement();

            // 4.执行sql
            String sql = "select id,username,password,phone,address from t_user";
            // 执行查询操作
            // 返回值:返回查询的所有数据的结果集
            // 在JDBC中,结果集对象为ResultSet
            rs = st.executeQuery(sql);

            // 5.处理结果集
            // 将数据库查询结果映射成Java对象
            // 查询结果中的每一行数据对应一个Java对象
            // 每一行数据中的一列对应Java对象的一个属性
            // 通过rs.next()方法读取下一行数据
            // 如果存在下一行数据,则返回true,如果不存在下一行数据,则返回false
            // 在一次循环中,不要多次调用next方法,会跳过部分数据
            while(rs.next()){
                // 每次读取时,在结果集中存放的是一行数据
                // 需要将这一行数据转换成一个Java对象
                // 因此,此处实例化一个User对象,为该对象的属性赋值
                User user = new User();
                // rs.getXxx(index):获取结果集中对应类型的第index列的数据
                // 开发中字段顺序可能会变化,因此不建议使用该方式
                // 该方法适用于不知道列名的情况
                // rs.getXxx("结果的字段名"):获取结果集中对应类型的指定列名的数据
                // user.setId(rs.getInt(1));
                // int id = rs.getInt("id");
                // user.setId(id);
                // 将一个数据库查询结果的字段名映射到Java对象的属性中,称之为映射操作
                // 类映射表,属性映射字段
                user.setId(rs.getInt("id"));
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
                user.setPhone(rs.getString("phone"));
                user.setAddress(rs.getString("address"));
                // 每映射一次,将映射完成的Java对象存放到对应的对象集合中
                users.add(user);
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 6.释放资源
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(st != null){
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(rs != null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        return users;
    }

}
